/**
WOP_Heap_Entry

進一步定義Entry中的關於Heap基本attribute
Obj和其他的兄弟內容有相當大的不同。

簡單的比較一下Ref跟Heap，Ref相當於pointer，而Heap相當於該物件在記憶體中的實體
通常，實體中會再包含一些子元素。

另外，Heap Entry必定是經由unfold一個Ref_Entry而出現的。
故其top為false。


賴念煒 -06/12/11 新增檔案。

06/12/20
	這邊要注意的是，當Heap消失時，他的子元素是否也跟著消失？這牽涉的問題很大
	不過，因為Heap暫時不會面臨remove的問題，所以先放著
	
	initAttribute()
	在要替子元素命名的時候，考量到子元素的名稱，
	以及要如何向CA明確表示"我要這傢伙"，遇到阻礙，所以本函式未完成。

06/12/21
覆寫WOP_Entry的
	string getActualPath(){//作出對應JDB的真實位址
	void update();
06/12/22
新增變數_refpath，
_path僅位於Heap_Entry，當有任何Ref_Entry去建立、或是更新Heap_Entry時，_refpath會被記錄下來。
接下來就很輕鬆了。因為任何一個WOP_Entry必定是

1.有個parent(Heap_Entry) - 所以他的路徑必定為_refpath+"."+name，或是_refpath[i];
2.沒有parent，也可以稱他是top(手動觀看)，路徑為_name;

所以只要確認_refpath被使用前有被確實更新即可。

06/12/23
	不允許呼叫update()，改為update(string s)。

	撰寫method說明。
06/12/24
	本Heap_Entry是從舊Obj_Entry分離出來，作為Array_Entry與Obj_Entry的parent。
	constructor 是否會繼承？

	繼承的constructor//destructor問題。
	B:public A
	實驗心得：子元素B不論何種constructor，必定會先進行一次A()(所以不能private)
	而且最後必定會進行parentA的destructor...
**/

#ifndef _WOP_Heap_Entry_H_
#define	_WOP_Heap_Entry_H_
/*------------------------------------------------------------*/
#include "WOP_Entry.h"
//這個include Vector是經由VC ++給予的"新增include目錄"功能，把前方的路徑省略
//所以如果換其他的IDE發現路徑錯誤，請自行更改路徑。
//Vector元件原位址:"smith/util/Vector.h"
#include <cassert>
class WOP_Heap_Entry:public WOP_Entry{
private:

protected:
	WOP_Heap_Entry(){}
	std::vector<WOP_Entry*> _element;
	virtual void init(string s, WOP_Entry *parent);
	virtual bool update();
	bool _unfolded ; // added by ypc 2008/4/28
	                // true, if this heap object has been unfolded
	                // when it is unfolded, the _element should not be empty
	
public:
	WOP_Heap_Entry(string s,string path);//其name和value皆為Address(JDB給予)
	~WOP_Heap_Entry();
	//這邊要注意的是，當Heap消失時，我們也要求WOP順便delete其子元素。
	virtual string getActualPath();
	virtual string getActualPath(string s){//將來由親生兒子詢問自己，「爸，雖然我名叫xx，但是我的全名到底叫什麼？」
		assert(false);
		return "";
	}
	virtual void setUnfolded(bool v) { _unfolded = v ; }
	virtual void setDescentFrom(WOP_Entry * _from) ;  // we override this method because 
	virtual bool update(string path);//path - 呼叫更新本Obj_Entry的Ref_Entry之ActualPath
	virtual void updateRealValue(string s) { assert(false); }

	virtual void addChild(WOP_Entry* en);
	virtual WOP_Entry* findMatchedWOP(string vartype, string name); // this method override the base class

	virtual std::vector<WOP_Entry *>* getChildsPtr() { return &_element ; }
	virtual std::vector<WOP_Entry *>  getChildren() { return _element ; }
	
	
};
/*------------------------------------------------------------*/
#endif	//#ifndef _WOP_Heap_Entry_H_